Computer programming is a process in which a step-by-step procedure or algorithm is described using an available computer language. The described procedure is then "manufactured" into a computer program which is then used to control a computer to produce a desired result. Typically, the procedures and algorithms which are implemented are complex, and require that programmers be extensively trained and skilled in two arts--the application area in which they are working and the programming discipline. The latter discipline preferably requires extensive training and skill in various programming methods and languages, as well as in manufacturing (production) methods used to make computer programs.
The earliest programmable computers were programmed "by hand" directly in the machine's internal language. The programming process for such machines required that a programmer have a detailed understanding of the internal workings of the particular class of computers, as well as of the process being programmed. Those requirements coupled with the limitations of early machine language programmable devices limited the scope of applicability of such devices.
To a large extent, machine language programming and devices were replaced by second generation assembler languages. Although assembler languages, like machine languages, were machine specific, they made it easier for programmers to relate to the operation of the computer.
Procedural computer languages evolved to deal with the machine-specific limitation of the foregoing languages. Procedural languages are discipline oriented, such as COBOL for business, and FORTRAN for engineering and science. Procedural languages, once learned, can be applied by a larger class of potential programmers, but the resulting program scripts which they produce must still be manufactured (compiled) into a machine language form that the particular computer can understand.
Numerous such procedural compiler type languages have been developed, and most computer programming now performed uses such languages. While procedural compiler type languages have simplified the programming process, programming is still considered to be too difficult for a larger class of potential users.
Some of the effort toward further simplifying the task or computer programming continues the focus on programming languages. A number of fourth generation languages feature a rich set of problem-solving capabilities, but accomplish this through a reduced language syntax and more abbreviated grammars for the expression of computer solutions. Thus, such fourth generation languages permit relatively inexperienced programmers to produce results, and somewhat more skilled persons to produce results much more quickly, but are still somewhat limited. In a manner analogous to the limitation of spoken language which would be caused by reducing syntax and richness of expression, the syntax and grammar abbreviations in fourth generation languages limit the richness of the medium and thus reduce much of the flexibility available to programmers for expressing themselves clearly and completely. As a result, there are many types of problems which cannot be expressed or solved with fourth generation languages.
Software strategies have also evolved toward simplifying the programming task. There are current proponents of a top-down design strategy and other proponents who prefer a bottom-up object oriented design strategy. Top-down designs encourage the decomposition of the process into smaller and smaller parts, arriving ultimately at structural programming units that are realized with conventional programming languages. Top-down designs have the benefit of structuring the program solution, but tend to result in unique program parts that can only rarely be reused in making new software programs.
The bottom-up object oriented design strategy focuses on designing common, more reusable program components called objects. These program objects can be modeled after real world objects and can be standardized in many ways. The object oriented approach also encompasses an "inheritance" quality whereby an object can be derived from another more basic object and "inherit" many, if not all, of its properties. This bottom-up design approach has the major qualities of producing software components that are modular, extensible and reusable, but is not as conducive to structured design methods of the top-down design. Nor does the bottom-up object oriented design apply very well to development of medium-to-large software units.
As a further attempt at simplifying and standardizing the programming task, macro programming capabilities have evolved. For example, most program languages make use of functional subprogramming units which might be called procedures, functions or class objects. These sub-units encode (or script) the detailed steps of well-defined and often-used sub-units of programming, so that they are available for constant re-use as needed.
The use of software building blocks has merit in standardizing the generation of computer code to a certain extent, but the technique is rarely applied in building more complex, high level programming scripts because of the almost infinite variety and variation of larger structural units. When attempts have been made to produce large, general purpose programs or program units, they have not been entirely successful because the programs thus produced are often too large, too slow and too difficult to adequately maintain.
Thus, the current attempts at simplifying the programming task have reached a number of limits. The fourth generation languages reduce flexibility in solving a wide variety of problems. The use of structural building blocks has been limited to relatively smaller sub-units, and programmers constructing larger units have typically relied on their own intuition, skill, and expertise in assembling large programs, each being customized in part to the talents and "writing style" of the programmer in question. Those programs which have a large degree of flexibility built in (such as UNIX), are found reasonably difficult to use and when fully configured not sufficiently fast or efficient.
As a result, in order to produce an application specific program adapted to run a particular defined task with adequate speed and efficiency, it has been the practice to employ programmers to apply their skill and expertise in writing program code, some customized to the task, others selected before customization from units they had previously known or which are considered by them or others to be standards, but the end result is a customized program having very little standardization. This application of individual authorship in generation of computer programs is one of the factors which limits the ability of non-experts to assemble programs. Thus, whereas computers themselves are becoming more and more widespread, computer users are not actually programming, but are simply utilizing applications programmed by others. To the extent such users desire to actually program a specific task for their own use, they are inhibited by the perceived complexity of the task and the need for the skill outlined above in generating task-specific computer programs.